package com.hb.common.task;

import jakarta.annotation.Resource;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.config.CronTask;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class CronTaskHandler implements DisposableBean {

    @Resource
    private TaskScheduler taskScheduler;

    // 保存任务Id和定时任务
    private final Map<Integer, ScheduledTask> scheduledTaskMap = new ConcurrentHashMap<>();

    /**
     * 添加定时任务
     *
     * @param task           任务
     * @param cronExpression cron表达式
     * @param jobId          任务ID
     */
    public void addTask(Runnable task, String cronExpression, Integer jobId) {
        if (this.scheduledTaskMap.containsKey(jobId)) {
            this.removeTask(jobId);
        }
        // 保存任务Id和定时任务
        ScheduledTask scheduledTask = new ScheduledTask();
        CronTask cronTask = new CronTask(task, cronExpression);
        scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());
        this.scheduledTaskMap.put(jobId, scheduledTask);
    }

    /**
     * 通过任务Id，取消定时任务
     *
     * @param jobId 任务Id
     */
    public void removeTask(Integer jobId) {
        ScheduledTask scheduledTask = this.scheduledTaskMap.remove(jobId);
        if (Objects.nonNull(scheduledTask)) {
            scheduledTask.cancel();
        }
    }

    /**
     * 对象销毁被时，关闭所有定时任务
     */
    @Override
    public void destroy() {
        this.scheduledTaskMap.values().forEach(ScheduledTask::cancel);
        this.scheduledTaskMap.clear();
    }

}